# -*- coding: utf-8 -*-
# @Time:  2025/4/13 18:14
# @File:  get_pos.py
# @Action:
# 定义一个处理图片缺口的函数，最后是返回x坐标，滑块移动不需要y坐标
# import cv2
#
# def get_pos(image):
#     # 首先使用高斯模糊去噪，噪声会影响边缘检测的准确性，因此首先要将噪声过滤掉
#     blurred = cv2.GaussianBlur(image, (5, 5), 0, 0)
#     # 边缘检测，得到图片轮廓
#     canny = cv2.Canny(blurred, 200, 400)  # 200为最小阈值，400为最大阈值，可以修改阈值达到不同的效果
#     # 轮廓检测
#     # cv2.findContours()函数接受的参数为二值图，即黑白的（不是灰度图），所以读取的图像要先转成灰度的，再转成二值图，此处canny已经是二值图
#     # contours：所有的轮廓像素坐标数组，hierarchy 轮廓之间的层次关系
#     contours, hierarchy = cv2.findContours(canny, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
#     # print(contours, hierarchy)
#     for i, contour in enumerate(contours):  # 对所有轮廓进行遍历
#         M = cv2.moments(contour)  # 并计算每一个轮廓的力矩(Moment)，就可以得出物体的质心位置
#         # print(M)
#         if M['m00'] == 0:
#             cx = cy = 0
#         else:
#             # 得到质心位置，打印这个轮廓的面积和周长，用于过滤
#             cx, cy = M['m10'] / M['m00'], M['m01'] / M['m00']
#             print(cv2.contourArea(contour), cv2.arcLength(contour, True))
#         # 判断这个轮廓是否在这个面积和周长的范围内
#         if 5000 < cv2.contourArea(contour) < 8000 and 300 < cv2.arcLength(contour, True) < 500:
#             print(cx)
#             if cx < 300:
#                 continue
#             print(cv2.contourArea(contour))
#             print(cv2.arcLength(contour, True))
#             # 外接矩形，x，y是矩阵左上点的坐标，w，h是矩阵的宽和高
#             x, y, w, h = cv2.boundingRect(contour)
#
#             cv2.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2)  # 画出矩行
#             # cv2.imshow('image', image)
#             cv2.imwrite('111.jpg', image)  # 保存。注意自己更换保存位置
#             return x
#     return 0
#
#
# verify_img = cv2.imread("big2.png")
# x = get_pos(verify_img)
# print('x', x)


# import cv2
# import numpy as np
#
# # 读取图像
# image = cv2.imread('big2.png')
# gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
#
# # 二值化处理
# _, binary_image = cv2.threshold(gray_image, 120, 255, cv2.THRESH_BINARY)
#
# # 边缘检测
# edges = cv2.Canny(binary_image, 50, 150)
#
# # 查找轮廓
# contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
#
# # 假设我们只关心最大的轮廓（缺口）
# max_contour = max(contours, key=cv2.contourArea)
# x, y, w, h = cv2.boundingRect(max_contour)
#
# # 计算质心
# M = cv2.moments(max_contour)
# if M["m00"] != 0:
#     cx = int(M["m10"] / M["m00"])
#     cy = int(M["m01"] / M["m00"])
# else:
#     cx, cy = x + w // 2, y + h // 2  # 如果质心计算失败，使用轮廓中心
#
# # 在原图上绘制缺口和质心位置
# cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
# cv2.circle(image, (cx, cy), 5, (0, 0, 255), -1)
#
# # 显示结果
# cv2.imshow('Image with Slider Gap', image)
# cv2.waitKey(0)
# cv2.destroyAllWindows()


import cv2

# 读取图片
image = cv2.imread('big.png')  # 请将'captcha_image.jpg'替换为实际图片路径

# 转换为灰度图像
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 边缘检测
edges = cv2.Canny(gray, 100, 200)

# 查找轮廓
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# 中心点
max_contour = max(contours, key=cv2.contourArea)

# 遍历轮廓，找到可能是缺口的轮廓（这里简单假设最大的轮廓为缺口轮廓，实际可能需调整判断逻辑）
max_area = 0
target_contour = None
for contour in contours:
    area = cv2.contourArea(contour)
    if area > max_area:
        max_area = area
        target_contour = contour

# 获取轮廓的外接矩形，其左上角坐标即缺口位置（粗略）
x, y, w, h = cv2.boundingRect(target_contour)
print(f"缺口位置坐标：{x-19},{y-19}")

# 计算质心
M = cv2.moments(max_contour)
if M["m00"] != 0:
    cx = int(M["m10"] / M["m00"])
    cy = int(M["m01"] / M["m00"])
else:
    cx, cy = x + w // 2, y + h // 2  # 如果质心计算失败，使用轮廓中心

# 在原图上绘制缺口位置  - 和质心
cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv2.circle(image, (cx, cy), 5, (0, 0, 255), -1)
print(f'{cx},{cy}')

cv2.circle(image, (x, y), 5, (255, 0, 0), -1)

cv2.imwrite('big_match.png', image)

# # 显示结果
# cv2.imshow('Image with Slider Gap', image)
# cv2.waitKey(0)
# cv2.destroyAllWindows()

